home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_023 / ver30 / tty / intuition / menu.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  5KB  |  267 lines

  1. /*
  2.  * Dynamic Intuition menu functions
  3.  * from the author of PDTerm
  4.  */
  5.  
  6. #include "exec/types.h"
  7. #include "exec/memory.h"
  8. #include "graphics/text.h"
  9. #include "intuition/intuition.h"
  10. #define    MEMFLAGS (LONG) (MEMF_PUBLIC | MEMF_CHIP | MEMF_CLEAR)
  11.  
  12. extern    char    *AllocMem();
  13. extern    LONG    FreeMem();
  14.  
  15. /*
  16.  * Create an instance of an Intuitext structure
  17.  * containing text, positioned at (left,top)
  18.  */
  19.  
  20. struct IntuiText *NewIText(text, left, top)
  21. char *text;
  22. int left, top;
  23. {
  24.     struct IntuiText *newtext = NULL;
  25.  
  26.     newtext = (struct IntuiText *)
  27.         AllocMem((LONG) sizeof(*newtext), MEMFLAGS);
  28.     newtext->IText = (UBYTE *)text;
  29.     newtext->FrontPen = 0;
  30.     newtext->BackPen = 1;
  31.     newtext->DrawMode = JAM2;
  32.     newtext->LeftEdge = left;
  33.     newtext->TopEdge = top;
  34.     newtext->ITextFont = NULL;
  35.     newtext->NextText = NULL;
  36.  
  37.     return(newtext);
  38. }
  39.  
  40. /*
  41.  * Add an Intuitext structure to the end of
  42.  * list of them, returning a pointer to the
  43.  * new Intuitext.
  44.  */
  45.  
  46. struct IntuiText *AddIText(IText, text)
  47. struct IntuiText *IText;
  48. char *text;
  49. {
  50.     struct IntuiText *newtext = NULL;
  51.  
  52.     newtext = (struct IntuiText *)
  53.         AllocMem((LONG) sizeof(*newtext), MEMFLAGS);
  54.                 
  55.     newtext->IText = (UBYTE *)text;
  56.     newtext->FrontPen = IText->FrontPen;
  57.     newtext->BackPen  = IText->BackPen;
  58.     newtext->DrawMode = IText->DrawMode;
  59.     newtext->LeftEdge = IText->LeftEdge;
  60.     newtext->TopEdge  = IText->TopEdge + 11;
  61.     newtext->ITextFont = IText->ITextFont;
  62.     newtext->NextText = NULL;
  63.     IText->NextText   = newtext;
  64.  
  65.     return(newtext);
  66. }
  67.  
  68. /*
  69.  * Dispose of a lise of IntuiText structures
  70.  */
  71.  
  72. DisposeIText(IText)
  73. struct IntuiText *IText;
  74. {
  75.     struct IntuiText *cur, *next;
  76.  
  77.     cur = IText;
  78.     for(next = cur->NextText; cur != NULL; next = next->NextText) {
  79.         FreeMem(cur,(LONG) sizeof(*cur));
  80.         cur = next;
  81.     }
  82. }
  83.  
  84.  
  85. /*
  86.  * Dynamic menu constructor functions
  87.  */
  88.  
  89. #define InterMenuWidth 15
  90.  
  91. /*
  92.  * Create a new menu structure.
  93.  */
  94.  
  95. struct Menu *NewMenu(menuname, width, height)
  96. char *menuname;
  97. int width, height;
  98. {
  99.     struct Menu *menu = NULL;
  100.  
  101.     menu = (struct Menu *)
  102.         AllocMem((LONG) sizeof(*menu), MEMFLAGS);
  103.  
  104.     menu->NextMenu = NULL;
  105.     menu->LeftEdge = 0;
  106.     menu->TopEdge = 0;
  107.     menu->Width = width;
  108.     menu->Height = height;
  109.     menu->Flags = MENUENABLED;
  110.     menu->MenuName = menuname;
  111.     menu->FirstItem = NULL;
  112.  
  113.     return(menu);
  114. }
  115.  
  116. /*
  117.  * Create a new menu and add it to
  118.  * the end of the list of menus.
  119.  */
  120. struct Menu *AddMenu(menus, MenuName, width, height)
  121. struct Menu *menus;
  122. char *MenuName;
  123. int width, height;
  124. {
  125.     struct Menu *newmenu;
  126.  
  127.     newmenu = NewMenu(MenuName, width, height);
  128.     newmenu->LeftEdge = menus->LeftEdge + menus->Width + InterMenuWidth;
  129.     menus->NextMenu = newmenu;
  130.     return(newmenu);
  131. }
  132.  
  133. /*
  134.  * Create a new menu item
  135.  */
  136.  
  137. struct MenuItem *NewMenuItem(name, width, height)
  138. char *name;
  139. int width, height;
  140. {
  141.     struct MenuItem *newitem = NULL;
  142.     struct IntuiText *NewIText(), *newtext = NULL;
  143.  
  144.     newitem = (struct MenuItem *)
  145.         AllocMem((LONG) sizeof(*newitem), MEMFLAGS);
  146.  
  147.     newtext = NewIText(name,0,1);
  148.  
  149.     newitem->NextItem = NULL;
  150.     newitem->ItemFill = (APTR) newtext;
  151.     newitem->LeftEdge = 0;
  152.     newitem->TopEdge = 0;
  153.     newitem->Width = width;
  154.     newitem->Height = height;
  155.     newitem->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  156.     newitem->MutualExclude = 0;
  157.     newitem->SelectFill = NULL;
  158.     newitem->Command = 0;
  159.     newitem->SubItem = NULL;
  160.     newitem->NextSelect = 0;
  161.  
  162.     return(newitem);
  163. }
  164.  
  165. /*
  166.  * Start the menu item list for a menu.
  167.  */
  168.  
  169. struct MenuItem *AddNewMenuItem(menu, name, width, height)
  170. struct Menu *menu;
  171. char *name;
  172. int width, height;
  173. {
  174.     struct MenuItem *newitem, *NewMenuItem();
  175.  
  176.     newitem = NewMenuItem(name, width, height);
  177.     menu->FirstItem = newitem;
  178.     return(newitem);
  179. }
  180.  
  181. /*
  182.  * Add to a menu item list
  183.  */
  184.  
  185. struct MenuItem *AddItem(items, name)
  186. struct MenuItem *items;
  187. char *name;
  188. {
  189.     struct MenuItem *newitem, *NewMenuItem();
  190.  
  191.     newitem = NewMenuItem(name, items->Width, items->Height);
  192.     newitem->TopEdge = items->TopEdge + items->Height;
  193.     newitem->LeftEdge = items->LeftEdge;
  194.     items->NextItem = newitem;
  195.     return(newitem);
  196. }
  197.  
  198. /*
  199.  * Start a list of subitems for a menu item.
  200.  */
  201.  
  202. struct MenuItem *AddNewSubItem(item, name, width, height)
  203. struct MenuItem *item;
  204. char *name;
  205. int width, height;
  206. {
  207.     struct MenuItem *newitem, *NewMenuItem();
  208.  
  209.     newitem = NewMenuItem(name, width, height);
  210.     item->SubItem = newitem;
  211.     newitem->LeftEdge = item->Width;
  212.     return(newitem);
  213. }
  214.  
  215. /*
  216.  * Dispose of a menu item.
  217.  */
  218.  
  219. DisposeItem(item)
  220. struct MenuItem *item;
  221. {
  222.     DisposeIText((struct ItuiText *)item->ItemFill);
  223.     FreeMem(item,(LONG) sizeof(*item));
  224. }
  225.  
  226. /*
  227.  * Dispose of a list of menu items.
  228.  */
  229.  
  230. DisposeItems(items)
  231. struct MenuItem *items;
  232. {
  233.     struct MenuItem *cur, *next;
  234.  
  235.     cur = items;
  236.     for(next = cur->NextItem; cur != NULL; next = next->NextItem){
  237.         DisposeItem(cur);
  238.         cur = next;
  239.     }
  240. }
  241.  
  242. /*
  243.  * Dispose of a single menu
  244.  */
  245. DisposeMenu(menu)
  246. struct Menu *menu;
  247. {
  248.     DisposeItems(menu->FirstItem);
  249.     FreeMem(menu,(LONG) sizeof(*menu));
  250. }
  251.  
  252. /*
  253.  * Get rid of a menu list.
  254.  */
  255. DisposeMenus(menus)
  256. struct Menu *menus;
  257. {
  258.     struct Menu *cur, *next;
  259.  
  260.     cur = menus;
  261.     for(next = cur->NextMenu; cur != NULL; next = next->NextMenu){
  262.         DisposeMenu(cur);
  263.         cur = next;
  264.     }
  265. }
  266.  
  267.